package cn.hinglo;

import cn.hinglo.common.cache.CacheManager;
import cn.hinglo.common.config.error.ErrorConstant;
import cn.hinglo.common.config.log.Sl4jLogFactory;
import cn.hinglo.common.config.proxy.SelfProxyFactory;
import cn.hinglo.common.config.render.SelfRenderFactory;
import cn.hinglo.common.constant.SystemConstant;
import cn.hinglo.common.handler.*;
import cn.hinglo.common.interceptors.exception.ExceptionInterceptor;
import cn.hinglo.common.interceptors.kit.JsonBodyInterceptor;
import cn.hinglo.common.interceptors.kit.ReturnInterceptor;
import cn.hinglo.common.interceptors.log.LogInterceptor;
import cn.hinglo.common.interceptors.security.LoginInterceptor;
import cn.hinglo.common.interceptors.security.PermissionInterceptor;
import cn.hinglo.common.util.PropertiesKit;
import cn.hinglo.common.util.RoutesKit;
import cn.hinglo.permission.model.MappingKit;
import com.jfinal.config.*;
import com.jfinal.ext.handler.ContextPathHandler;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.SqlReporter;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.hikaricp.HikariCpPlugin;
import com.jfinal.template.Engine;
import com.jfinal.template.source.ClassPathSourceFactory;
import lombok.extern.slf4j.Slf4j;

/**
 * @createTime: 2018/12/11
 * @author: HingLo
 * @description: 自定义的一下配置
 */
@Slf4j
public class PermissionAdminConfig extends JFinalConfig {
    /**
     * 通过操作系统来判断是否是开发者模式
     */
    private boolean debug = System.getProperty("os.name").toLowerCase().startsWith("win");
//    private boolean debug = true;

    @Override
    public void configConstant(Constants constants) {
        prop = PropertiesKit.getProp();
        constants.setDevMode(true);
        // 自定义返回Render ,之所以重写此方法,是因为重写了跨域请求时系统框架中的错误返回
        constants.setRenderFactory(new SelfRenderFactory());
        constants.setInjectDependency(true);
        //设置日期返回的格式
        constants.setJsonDatePattern("yyyy-MM-dd");
        // 设置日志系统
        constants.setLogFactory(new Sl4jLogFactory());
        // 设置自定义的代理工厂
        constants.setProxyFactory(new SelfProxyFactory());
        // 全局的错误配置
        ErrorConstant.errorView(constants);

    }

    @Override
    public void configRoute(Routes routes) {
        // 自定义自动扫描路由工具,与系统不冲突
        RoutesKit.initRoutes(routes);
    }

    @Override
    public void configEngine(Engine me) {

    }

    @Override
    public void configPlugin(Plugins plugins) {
        //**** 数据连接池插件****
        HikariCpPlugin dataSourcePlugin = new HikariCpPlugin(prop.get("jdbcUrl"), prop.get("user"), prop.get("password"));
        dataSourcePlugin.setDriverClass("com.mysql.cj.jdbc.Driver");
        dataSourcePlugin.setMaximumPoolSize(2);
        //**** 数据操作插件****
        ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(dataSourcePlugin);
        // 设置方言
        activeRecordPlugin.setDialect(new MysqlDialect());
        //设置显示sql语句
        activeRecordPlugin.setShowSql(true);
        // 显示SQL的时候，使用日志输出的方式
        SqlReporter.setLog(true);
        //sql动态管理插件
        activeRecordPlugin.getEngine().setSourceFactory(new ClassPathSourceFactory());
        activeRecordPlugin.addSqlTemplate("application.sql");
        activeRecordPlugin.getEngine().addSharedMethod(new StrKit());
        //添加表与实体的对应关系
        MappingKit.mapping(activeRecordPlugin);

        //****************插件应用*************//
        //连接池
        plugins.add(dataSourcePlugin);
        //数据库
        plugins.add(activeRecordPlugin);
        // ehcache
//        plugins.add(new EhCachePlugin());

        // Redis
//        plugins.add(new RedisPlugin("mainCache", "192.168.10.119", 6379));

        // 定时任务插件
//        plugins.add(new QuartzPlugin());

//        //MQTT 插件
//        MqttPlugin mqttPlugin = new MqttPlugin();
//        plugins.add(mqttPlugin);

//        ActiveMqPlugin activeMqPlugin = new ActiveMqPlugin("tcp://127.0.0.1:61616");
//        plugins.add(activeMqPlugin);

    }

    @Override
    public void configInterceptor(Interceptors interceptors) {
        // 全文请求日志记录
        interceptors.addGlobalActionInterceptor(new LogInterceptor());
        //添加全局异常处理拦截器
        interceptors.add(new ExceptionInterceptor());
        //登录拦截器
        interceptors.addGlobalActionInterceptor(new LoginInterceptor());
        // 权限拦截器
        interceptors.addGlobalActionInterceptor(new PermissionInterceptor());
        // 全局Json拦截器。用于自动注入Json对象
        interceptors.addGlobalActionInterceptor(new JsonBodyInterceptor());
        // 返回值拦截器
        interceptors.add(new ReturnInterceptor());
    }

    @Override
    public void configHandler(Handlers handlers) {
        handlers.add(new ContextPathHandler());
        // Ajax 跨域处理
        if (debug) {
            handlers.add(new CorsHandler());
        }
        // 过滤掉 options 请求操作
        handlers.add(new OptionsHandler());
        // 允许读取的Header
        handlers.add(new AllowHeaderHandler());
        //Xss攻击处理
        handlers.add(new XssHandler());
        // 接口拦截器
        handlers.add(new ApiHandler("/api"));

    }

    @Override
    public void onStart() {
        // 初始化定是任务
//        QuartzManager.getSingleton().initTask();
        // 缓存信息配置
        CacheManager.addConfig(SystemConstant.LOGIN_ERROR, 60);
    }
}
